package spel;

import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
/**
 * Een klasse die een spel PentagoXL kan spelen
 * Vraagt om de beurt aan spelers om een zet en kijkt of het spel is afgelopen
 * @author Tim en Stef
 *
 */
public class Spel extends Observable implements Runnable {
	List<Speler> spelers;
	Knikker current;
	Bord b;
	public static final Color[] colors = { Color.RED, Color.BLUE, Color.GREEN,
			Color.MAGENTA};
	public static int KNIKKERCOUNT = 20;
	
	/**
	 * Creeert een spel met de megegeven lijst aan spelers
	 * @param spelers De spelers die meespelen in het spel
	 */
	public Spel(List<Speler> spelers) {
		this.spelers = spelers;
	}

	/**
	 * Returned het Bord van het huidige Spel
	 * @return
	 */
	public Bord getBord() {
		return b;

	}

	/**
	 * Geeft een lijst terug met alle spelers
	 * @return De lijst van spelers
	 */
	public List<Speler> getSpelers() {
		return spelers;
	}
	/**
	 * @return de speler die op het moment aan zet is
	 */
	public Speler getCurrentSpeler() {
		return current.getSpeler();
	}

	@Override
	/**
	 * Start het spel daadwerkelijk.
	 * Initialiseerd de Knikkers van de spelers en het Bord
	 * Zal doorgaan tot de knikkers op zijn of totdat een speler gewonnen heeft.
	 */
	public void run() {
		boolean ended = false;
		b = new Bord();
		if(spelers.size() == 2){
			KNIKKERCOUNT = 40;
		}else{
			KNIKKERCOUNT = 20;
		}
		ArrayList<Knikker> knikkers = new ArrayList<Knikker>();
		for (int i = 0; i < spelers.size(); i++) {
			knikkers.add(new Knikker(colors[i], KNIKKERCOUNT, spelers.get(i)));
		}
		current = knikkers.get(0);
		setChanged();
		this.notifyObservers(current);
		while (!ended) {
			Zet z = current.getSpeler().doeZet(b);
			if (z != null) {
				z.knikker = current;
			}
			if (z != null && z.isValide() && b.isLeegVeld(z.x, z.y)) {
				b.PlaatsKnikker(z.x, z.y, current);
				this.setChanged();
				this.notifyObservers(new Zet(current, z.x, z.y, -1, null));
				if (b.isWinnaar().size() != 0) {
					ended = true;
					this.setChanged();
					this.notifyObservers(b.isWinnaar());
					this.setChanged();
					this.notifyObservers(new Zet(current, -1, -1, z.index,
							z.richting));
				} else {
					b.DraaiSubBord(z.index, z.richting);
					this.setChanged();
					this.notifyObservers(new Zet(current, -1, -1, z.index,
							z.richting));
					if (b.isWinnaar().size() != 0) {
						ended = true;
						this.setChanged();
						this.notifyObservers(b.isWinnaar());
					}
				}

				if (b.isVol()) {
					ended = true;
					this.setChanged();
					this.notifyObservers(new ArrayList<Speler>());
				} else if(!ended){
					if (knikkers.indexOf(current) != knikkers.size() - 1) {
						current = knikkers.get(knikkers.indexOf(current) + 1);
					} else {
						current = knikkers.get(0);
					}
					this.setChanged();
					this.notifyObservers(current);
					if (current.getAantal() == 0) {
						ended = true;
						this.setChanged();
						this.notifyObservers(new ArrayList<Speler>());
					}
				}
			}
		}

	}

}
